home *** CD-ROM | disk | FTP | other *** search
GW-BASIC | 1980-01-01 | 4.9 KB | 168 lines |
- 10 '*******************
- 20 '** PLOT-3D **
- 30 '*******************
- 40 '
- 50 CLEAR
- 60 SCREEN 2
- 70 KEY OFF
- 80 CLS
- 90 DIM HIGH%(640),LOW%(640)
- 100 DEF FNDTR(X) = X/57.2958
- 110 LINE (240,5)-(390,17),,B
- 120 LINE (236,3)-(394,19),,B
- 130 LINE (232,1)-(398,21),,B
- 140 LOCATE 2,37
- 150 PRINT "PLOT-3D"
- 160 PRINT
- 170 '
- 180 '********************************************
- 190 '** Ask the user for the plot parameters **
- 200 '********************************************
- 210 LOCATE 7,1
- 220 PRINT "Just a reminder ..."
- 230 LOCATE 8,12
- 240 PRINT "Your function Z=f(X,Y) should be defined at line 9000"
- 250 PRINT
- 260 INPUT "Enter X range ... Minimum, Maximum";XMIN,XMAX
- 270 PRINT
- 280 INPUT "Enter Y range ... Minimum, Maximum";YMIN,YMAX
- 290 PRINT
- 300 INPUT "Enter Z range ... Minimum, Maximum";ZMIN,ZMAX
- 310 PRINT
- 320 INPUT "Tilt angle (degrees)";TILT
- 330 PRINT
- 340 INPUT "Rotation angle (degrees)";ROTA
- 350 PRINT
- 360 INPUT "Number of X lines to plot";XLINES
- 370 PRINT
- 380 INPUT "Number of Y lines to plot";YLINES
- 390 PRINT
- 400 INPUT "Want hidden line removal (y/n) ";Q$
- 410 HIDE = 0
- 420 IF Q$ = "y" OR Q$ = "Y" THEN HIDE = 1
- 430 '
- 440 '***********************************************************************
- 450 '** Much of the math is done only once ... speeding things up later **
- 460 '***********************************************************************
- 470 CTILT = COS(FNDTR(TILT))
- 480 STILT = SIN(FNDTR(TILT))
- 490 CROTA = COS(FNDTR(ROTA))
- 500 SROTA = SIN(FNDTR(ROTA))
- 510 XMEAN = (XMAX+XMIN)/2
- 520 XDIFF = XMAX-XMIN
- 530 YMEAN = (YMAX+YMIN)/2
- 540 YDIFF = YMAX-YMIN
- 550 ZMEAN = (ZMAX+ZMIN)/2
- 560 ZDIFF = ZMAX-ZMIN
- 570 '
- 580 '***********************************
- 590 '** Plot the X lines ... if any **
- 600 '***********************************
- 610 CLS
- 620 LOCATE 9,23
- 630 IF XLINES < 2 THEN 810
- 640 IF HIDE = 0 THEN 680
- 650 PRINT "Initialization is taking place ..."
- 660 GOSUB 1260
- 670 CLS
- 680 FOR Y = YMAX TO YMIN STEP YDIFF/(1-XLINES)
- 690 FOR X = XMIN TO XMAX STEP XDIFF/50
- 700 XLAST = XPLOT
- 710 YLAST = YPLOT
- 720 GOSUB 1360
- 730 IF X = XMIN THEN 760
- 740 IF HIDE = 0 THEN LINE (XLAST,YLAST)-(XPLOT,YPLOT)
- 750 IF HIDE = 1 THEN GOSUB 1490
- 760 NEXT X,Y
- 770 '
- 780 '***********************************
- 790 '** Plot the Y lines ... if any **
- 800 '***********************************
- 810 IF YLINES < 2 THEN 960
- 820 IF HIDE THEN GOSUB 1260
- 830 FOR X = XMIN TO XMAX STEP XDIFF/(YLINES-1)
- 840 FOR Y = YMIN TO YMAX STEP YDIFF/50
- 850 XLAST = XPLOT
- 860 YLAST = YPLOT
- 870 GOSUB 1360
- 880 IF Y = YMIN THEN 910
- 890 IF HIDE = 0 THEN LINE (XLAST,YLAST)-(XPLOT,YPLOT)
- 900 IF HIDE = 1 THEN GOSUB 1490
- 910 NEXT Y,X
- 920 '
- 930 '*************************************************
- 940 '** Review of plot parameters before quitting **
- 950 '*************************************************
- 960 GOSUB 1180
- 970 CLS
- 980 PRINT "Your last plot had these parameters ..."
- 990 PRINT
- 1000 PRINT "The X values went from ";XMIN;"to ";XMAX
- 1010 PRINT "The Y values went from ";YMIN;"to ";YMAX
- 1020 PRINT "The Z axis went from ";ZMIN;"to ";ZMAX
- 1030 PRINT "The view was tilted ";TILT;"degrees"
- 1040 PRINT "The view was rotated ";ROTA;"degrees"
- 1050 PRINT XLINES;"lines were plotted in the X direction"
- 1060 PRINT YLINES;"lines were plotted in the Y direction"
- 1070 PRINT "The hidden line option was ";
- 1080 IF HIDE=0 THEN PRINT "not ";
- 1090 PRINT "selected"
- 1100 PRINT
- 1110 PRINT "Your defined function ..."
- 1120 PRINT
- 1130 LIST 9000-
- 1140 '
- 1150 '*********************************************************
- 1160 '** Subroutine to wait until user is ready to proceed **
- 1170 '*********************************************************
- 1180 LOCATE 24,1
- 1190 PRINT"Press any key to continue ...";
- 1200 K$ = INKEY$
- 1210 IF K$ = "" THEN 1200 ELSE RETURN
- 1220 '
- 1230 '*****************************************************************
- 1240 '** Subroutine to initialize arrays for hidden line algorithm **
- 1250 '*****************************************************************
- 1260 FOR I = 0 TO 640
- 1270 LOW%(I) = 200
- 1280 HIGH%(I) = 0
- 1290 NEXT I
- 1300 RETURN
- 1310 '
- 1320 '**************************************************************
- 1330 '** Subroutine to project space points onto a plane taking **
- 1340 '** into account the tilt and rotation for the viewpoint **
- 1350 '**************************************************************
- 1360 GOSUB 9000
- 1370 X2 = (X-XMEAN) / XDIFF
- 1380 Y2 = (Y-YMEAN) / YDIFF
- 1390 Z2 = (Z-ZMEAN) / ZDIFF
- 1400 X3 = X2 * CROTA - Y2 * SROTA
- 1410 Y3 = Z2 * CTILT - (X2 * SROTA + Y2 * CROTA) * STILT
- 1420 XPLOT = 320 + 370 * X3
- 1430 YPLOT = 100 - 116 * Y3
- 1440 RETURN
- 1450 '
- 1460 '******************************************************
- 1470 '** Subroutine for plotting with hidden line check **
- 1480 '******************************************************
- 1490 FOR XTST% = XLAST TO XPLOT STEP SGN(XPLOT-XLAST)
- 1500 PFLG = 0
- 1510 YTST% = YLAST + (XTST%-XLAST) * (YPLOT-YLAST) / (XPLOT-XLAST)
- 1520 IF LOW%(XTST%) <= YTST% THEN 1550
- 1530 LOW%(XTST%) = YTST%
- 1540 PFLG = 1
- 1550 IF HIGH%(XTST%) >= YTST% THEN 1580
- 1560 HIGH%(XTST%) = YTST%
- 1570 PFLG = 1
- 1580 IF PFLG = 1 THEN PSET(XTST%,YTST%)
- 1590 NEXT XTST%
- 1600 RETURN
- 1610 '
- 8970 '********************************************************
- 8980 '** User function starts at line 9000 ... Z = f(X,Y) **
- 8990 '********************************************************
- 9000 Z = SQR(X*X+Y*Y)
- 9010 IF Z <> 0 THEN Z = SIN(Z)/Z ELSE Z=1
- 9020 RETURN
-